package com.item.utils;
import java.io.Serializable;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.*;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;

@Component
public class RedisUtils {
    @Autowired
    private RedisTemplate redisTemplate;
    @Autowired
    private StringRedisTemplate stringRedisTemplate;


    //默认缓存3小时
    private final static Integer expSecondsTime = 10800;//60*60*3=10800

    /**
     * 添加对象缓存，默认缓存一小时
     *
     * @param key   缓存key
     * @param value 缓存值
     */
    public void addCache(String key, Object value) {
        //添加缓存
        redisTemplate.opsForValue().set(key, value, expSecondsTime, TimeUnit.SECONDS);
    }

    /**
     * 添加字符串缓存，默认缓存一小时
     *
     * @param key   缓存key
     * @param value 缓存值
     */
    public void addCache(String key, String value) {
        //添加缓存
        stringRedisTemplate.opsForValue().set(key, value, expSecondsTime, TimeUnit.SECONDS);
    }

    /**
     * 添加集合缓存，默认缓存一小时
     *
     * @param key   缓存key
     * @param value 缓存值
     */
    public void addCache(String key, List value) {
        //添加缓存
        redisTemplate.opsForList().rightPushAll(key, value);
    }

    /**
     * 添加对象缓存，指定缓存时间 缓存
     *
     * @param key      缓存key
     * @param value    缓存值
     * @param expTime  过期时间
     * @param timeUnit 时间类型
     */
    public void addCache(String key, Object value, Long expTime, TimeUnit timeUnit) {
        //添加缓存
        redisTemplate.opsForValue().set(key, value, expTime, timeUnit);
    }

    /**
     * 添加字符串缓存，指定缓存时间 缓存
     *
     * @param key      缓存key
     * @param value    缓存值
     * @param expTime  过期时间
     * @param timeUnit 时间类型
     */
    public void addCache(String key, String value, Long expTime, TimeUnit timeUnit) {
        //添加缓存
        stringRedisTemplate.opsForValue().set(key, value, expTime, timeUnit);
    }

    public void addCache(String key, List value, Long expTime, TimeUnit timeUnit) {
        //添加缓存
        redisTemplate.opsForList().rightPushAll(key, value);
        redisTemplate.expire(key,expTime,timeUnit);
    }

    /**
     * 获取缓存
     *
     * @param key 缓存key
     * @return
     */
    public Object getCache(String key) {
        return redisTemplate.opsForValue().get(key);
    }

    /**
     * 获取缓存
     *
     * @param key 缓存key
     * @return
     */
    public String getCacheString(String key) {
        return stringRedisTemplate.opsForValue().get(key);
    }

    /**
     * 获取缓存
     *
     * @param key 缓存key
     * @return
     */
    public List getCacheList(String key) {
        return (List) redisTemplate.opsForList().range(key,0,10000);
    }

    /**
     * 获取分页缓存
     *
     * @param key 缓存key
     * @return
     */
    public List getCacheListPage(String key, int page, int limit) {
        return redisTemplate.opsForList().range(key, (page - 1) * limit, (page) * limit-1);
    }

    /**
     * 删除缓存
     *
     * @param key 缓存key
     * @return
     */
    public void deleteCache(String key) {
        //测试发现：redisTemplate可以删除stringRedisTemplate构建的缓存。
        redisTemplate.delete(key);
    }

}